package config

import (
	"time"

	"github.com/go-kratos/kratos/v2/config"
	"github.com/go-kratos/kratos/v2/config/file"
	"github.com/go-kratos/kratos/v2/log"
	"github.com/go-redis/redis/v8"
)

// Config 应用所有配置的结构体
type Config struct {
	Server *ServerConfig `json:"server"`
	Log    *LogConfig    `json:"log"`
	Redis  *RedisConfig  `json:"redis"`
	Room   *RoomConfig   `json:"room"`
}

// ServerConfig 服务端口配置
type ServerConfig struct {
	GRPC *GRPCConfig `json:"grpc"`
	HTTP *HTTPConfig `json:"http"`
}

// GRPCConfig gRPC服务配置
type GRPCConfig struct {
	Addr    string `json:"addr"`
	Timeout int64  `json:"timeout"` // 毫秒
}

// HTTPConfig HTTP服务配置
type HTTPConfig struct {
	Addr    string `json:"addr"`
	Timeout int64  `json:"timeout"` // 毫秒
}

// LogConfig 日志配置
type LogConfig struct {
	Level  string `json:"level"`
	Format string `json:"format"`
	Output string `json:"output"`
}

// RedisConfig Redis配置（映射到redis.Options）
type RedisConfig struct {
	Addr        string `json:"addr"`
	Password    string `json:"password"`
	DB          int    `json:"db"`
	PoolSize    int    `json:"pool_size"`
	IdleTimeout int64  `json:"idle_timeout"` // 秒
}

// RoomConfig 房间服务特有配置
type RoomConfig struct {
	MaxPlayers    int `json:"max_players"`
	Timeout       int `json:"timeout"` // 秒
	MatchQueueMax int `json:"match_queue_max"`
}

// Load 加载配置文件
func Load() *Config {
	// 初始化Kratos配置管理器
	c := config.New(
		config.WithSource(
			file.NewSource("../../config/config.yaml"), // 基础配置
			//file.NewSource("configs/config.dev.yaml"), // 开发环境配置（可选）
			// 生产环境可注释掉dev，只留prod：
			// file.NewSource("configs/config.prod.yaml"),
		),
	)
	defer c.Close()

	// 加载配置
	if err := c.Load(); err != nil {
		log.Fatalf("加载配置失败: %v", err)
	}

	// 解析配置到结构体
	var cfg Config
	if err := c.Scan(&cfg); err != nil {
		log.Fatalf("解析配置失败: %v", err)
	}

	return &cfg
}

// ToRedisOptions 将RedisConfig转换为redis.Options（方便直接使用）
func (rc *RedisConfig) ToRedisOptions() *redis.Options {
	return &redis.Options{
		Addr:     rc.Addr,
		Password: rc.Password,
		DB:       rc.DB,
		PoolSize: rc.PoolSize,
		// 关键修复：将秒转换为time.Duration类型
		IdleTimeout: time.Duration(rc.IdleTimeout) * time.Second,
	}
}
